//Code Here.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5+5;

int n,q;
ll a[N];
ll t[N<<2],lz[N<<2];//开四倍于ai大小的数组

void update(int s,int e,int o,ll x){
   t[o]+=(e-s+1)*x,lz[o]+=x;       
}
void pushup(int o){
   t[o]=t[o<<1]+t[o<<1|1];
}

void pushdown(int s,int e,int o){
   if(lz[o]==0) return;

   int mid=(s+e)>>1,ls = o << 1, rs = o << 1 | 1;

   update(s,mid,ls,lz[o]);
   update(mid+1,e,rs,lz[o]);  

   lz[o]=0;
}

void buildTree(int s=1,int e=n,int o=1){
   if(s==e){
       t[o]= a[s];
       return;//等价于return t[o]=t[s],void() 压行技巧
   }
   int mid = (s+e)>>1;
   buildTree(s,mid,o<<1),buildTree(mid+1,e,o<<1|1);
   pushup(o);
}

void add(int l, int r, ll x, int s=1,int e=n,int o=1){
   //终端节点
   if(l<=s && r>=e){
       update(s,e,o,x);
       return;
   }
   pushdown(s,e,o);//向下走之前一定要pushdown
   int mid =(s+e)>>1;
   if(mid>=l)add(l,r,x,s,mid,o<<1);
   if(mid+1<=r)add(l,r,x,mid+1,e,o<<1|1);
   pushup(o);//修改一定要pushup
}

ll query(int l, int r, int s=1,int e=n,int o=1){
   //终端节点
   if(l<=s && r>=e){
       return t[o];
   }
   pushdown(s,e,o);//向下走之前一定要pushdown
   int mid =(s+e)>>1;
   ll res = 0;
   if(mid>=l)res+=query(l,r,s,mid,o<<1);
   if(mid+1<=r)res+=query(l,r,mid+1,e,o<<1|1);
   return res;
}

int main(){
   ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

   cin >> n >> q;

   for(int i=1;i<=n;++i) cin >> a[i];

   buildTree();

   while(q--){
       int op; cin >> op;
       if(op==1){
           ll l,r,x; cin >> l >> r >> x;
           add(l,r,x);                  
       }
       if(op==2){
           ll l,r;cin >> l >> r;
           cout << query(l,r) << '\n';
       }
   }
   return 0;
}